package com.zy.ems.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springframework.web.servlet.ModelAndView;

import com.zy.ems.common.base.ServiceResponse;
import com.zy.ems.common.exception.BaseErrorStatus;
import com.zy.ems.common.exception.BusinessException;
import com.zy.ems.common.exception.ErrorStatus;

public class ResultTool {
    private static Logger logger = LoggerFactory.getLogger(ResultTool.class);

    /**
     * 创建成功时返回结果对象。
     * 
     * @return ServiceResponse<T>
     */
    public static <T> ServiceResponse<T> success() {
        return success(null);
    }

    /**
     * 创建成功时返回结果对象。
     * 
     * @param data
     * @return ServiceResponse<T>
     */
    public static <T> ServiceResponse<T> success(T data) {
        return ServiceResponse.success(data);
    }

    /**
     * 处理指定异常的返回结果。
     * 
     * @param e
     * @return ServiceResponse<T>
     */
    public static <T> ServiceResponse<T> error(Throwable e) {
        return ServiceResponse.error(e);
    }

    /**
     * 处理指定异常的返回结果。
     * 
     * @param e
     * @return ServiceResponse<T>
     */
    public static <T> ServiceResponse<T> error(ErrorStatus errorStatus) {
        return ServiceResponse.error(errorStatus);
    }

    /**
     * 包装正确结果集。
     * 
     * @param result
     * @return
     */
    @Deprecated
    public static ModelAndView createSuccess(Object result) {
        return createSuccess(result, null);
    }

    /**
     * 包装正确结果集。
     * 
     * @param result
     * @param view
     * @return
     */
    @Deprecated
    public static ModelAndView createSuccess(Object result, ModelAndView view) {
        view = view == null ? new ModelAndView() : view;
        logger.info(200 + ":" + "OK");
        view.addObject("code", 200);
        view.addObject("codeMsg", "OK");
        view.addObject("result", result);
        return view;
    }

    /**
     * 使用提供的ModelAndView，可以少创建一次对象，推荐使用。
     * 
     * @param errorCode
     * @param view
     * @return
     */
    @Deprecated
    public static ModelAndView createError(ErrorStatus errorStatus,
            ModelAndView view) {
        Assert.notNull(errorStatus);
        Assert.notNull(view);

        logger.error(
                errorStatus.getCode() + ":" + errorStatus.getReasonPhrase());
        view.addObject("code", errorStatus.getCode());
        view.addObject("codeMsg", errorStatus.getReasonPhrase());
        return view;
    }

    /**
     * 使用已有的ModelAndView，打印异常堆栈，返回500系统错误编码。
     * 
     * @param e
     * @param view
     * @return
     */
    @Deprecated
    public static ModelAndView createError(Throwable e, ModelAndView view) {
        view = view == null ? new ModelAndView() : view;
        logger.error(e.getMessage(), e);
        if (e instanceof BusinessException) {
            return createError(((BusinessException) e).getError(), view);
        }
        return createError(BaseErrorStatus.ERROR, view);
    }

}
